54. 螺旋矩阵
54. 螺旋矩阵
分析
跟 59. 螺旋矩阵 II 相比,其实没什么差别,无非就是需要处理只有一横或者只有一竖的场景,其实这样很好处理,这样就不需要考虑到了边界转圈这些情况了,直接按一唯数组遍历即可。而且此时 rowNow 和 colNow 都不需要换。
解题
public List<Integer> spiralOrder(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
Integer[] resultArr = new Integer[rows*cols];
int rowNow=0,colNow=0;
int rowMin = 0,rowMax = rows-1,colMin = 0,colMax = cols-1;
for(int i=0;i<rows*cols;i++){
if(colMin==colMax || rowMin==rowMax){
// 直接遍历完即可
if(colMin==colMax && rowMin==rowMax){
resultArr[i]=matrix[rowNow][colNow];
}else{
if(colMin==colMax){
// 不需要考虑转圈
resultArr[i]=matrix[rowNow][colNow];
rowNow++;
}
else if(rowMin==rowMax){
// 不需要考虑转圈
resultArr[i]=matrix[rowNow][colNow];
colNow++;
}
}
}else if(rowNow==rowMin && colMin <= colNow && colNow < colMax ){
resultArr[i]=matrix[rowNow][colNow];
colNow++;
}else if(colNow==colMax && rowMin <= rowNow && rowNow < rowMax ){
resultArr[i]=matrix[rowNow][colNow];
rowNow++;
}else if(rowNow==rowMax && colMin < colNow && colNow <= colMax ){
resultArr[i]=matrix[rowNow][colNow];
colNow--;
}else if(colNow==colMin && rowMin < rowNow && rowNow <= rowMax ){
resultArr[i]=matrix[rowNow][colNow];
rowNow--;
if(colNow==colMin && rowNow==rowMin ){
rowMin++;
rowMax--;
colMin++;
colMax--;
// 重置起点
colNow++;
rowNow++;
}
}
}
return Arrays.asList(resultArr);
}
上面这种解法是我们在 59. 螺旋矩阵 II 中提出了三种解法中的第一种的延续,后面两种在解法在解决当前这道题的时候或多或少都会有点问题,不建议使用。
笨方法有时候就是最通用的方法。